From 1e66efe5169dfad9a0c62ba42fbf31ce977bf49e Mon Sep 17 00:00:00 2001 From: Sebastien Castiel Date: Tue, 19 Dec 2023 09:36:40 -0500 Subject: Use modal dialogs for expense creation & edition (#10) * First attemps at using route interception and modals * Remove route interception * Make it work * Use Vaul on small screens * Improve vaul --- src/app/groups/[groupId]/@modal/default.tsx | 3 + src/app/groups/[groupId]/@modal/expense-modal.tsx | 83 ++++++++++++++++++++++ .../@modal/expenses/[expenseId]/edit/page.tsx | 26 +++++++ .../[groupId]/@modal/expenses/create/page.tsx | 24 +++++++ 4 files changed, 136 insertions(+) create mode 100644 src/app/groups/[groupId]/@modal/default.tsx create mode 100644 src/app/groups/[groupId]/@modal/expense-modal.tsx create mode 100644 src/app/groups/[groupId]/@modal/expenses/[expenseId]/edit/page.tsx create mode 100644 src/app/groups/[groupId]/@modal/expenses/create/page.tsx (limited to 'src/app/groups/[groupId]/@modal') diff --git a/src/app/groups/[groupId]/@modal/default.tsx b/src/app/groups/[groupId]/@modal/default.tsx new file mode 100644 index 0000000..86b9e9a --- /dev/null +++ b/src/app/groups/[groupId]/@modal/default.tsx @@ -0,0 +1,3 @@ +export default function Default() { + return null +} diff --git a/src/app/groups/[groupId]/@modal/expense-modal.tsx b/src/app/groups/[groupId]/@modal/expense-modal.tsx new file mode 100644 index 0000000..17bb302 --- /dev/null +++ b/src/app/groups/[groupId]/@modal/expense-modal.tsx @@ -0,0 +1,83 @@ +'use client' +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, +} from '@/components/ui/dialog' +import { useRouter } from 'next/navigation' +import { ReactNode, useEffect, useState } from 'react' +import { Drawer } from 'vaul' + +type Props = { + children: ReactNode + title: ReactNode +} + +export function ExpenseModal(props: Props) { + const size = useTailwindBreakpoint() + if (size === 'xs') { + return + } else { + return + } +} + +export function ExpenseDialog({ children, title }: Props) { + const router = useRouter() + + return ( + router.back()}> + + + {title} + + {children} + + + ) +} + +export function ExpenseVaul({ children, title }: Props) { + const router = useRouter() + return ( + router.back()}> + + {title} + + +
+
{title}
+
{children}
+
+
+
+ ) +} + +export function useTailwindBreakpoint() { + const [size, setSize] = useState<'xs' | 'sm' | 'md' | 'lg'>('xs') + + useEffect(() => { + const handleBreakpointChange = () => { + if (window.innerWidth >= 1200) { + setSize('lg') + } else if (window.innerWidth >= 768) { + setSize('md') + } else if (window.innerWidth >= 640) { + setSize('sm') + } else { + setSize('xs') + } + } + + window.addEventListener('resize', handleBreakpointChange) + handleBreakpointChange() + + return () => { + window.removeEventListener('resize', handleBreakpointChange) + } + }, []) + + return size +} diff --git a/src/app/groups/[groupId]/@modal/expenses/[expenseId]/edit/page.tsx b/src/app/groups/[groupId]/@modal/expenses/[expenseId]/edit/page.tsx new file mode 100644 index 0000000..fb70f45 --- /dev/null +++ b/src/app/groups/[groupId]/@modal/expenses/[expenseId]/edit/page.tsx @@ -0,0 +1,26 @@ +import { ExpenseModal } from '@/app/groups/[groupId]/@modal/expense-modal' +import { ExpenseForm } from '@/components/expense-form' +import { getExpense, getGroup } from '@/lib/api' +import { Metadata } from 'next' +import { notFound } from 'next/navigation' + +export const metadata: Metadata = { + title: 'Edit expense', +} + +export default async function EditExpensePage({ + params: { groupId, expenseId }, +}: { + params: { groupId: string; expenseId: string } +}) { + const group = await getGroup(groupId) + if (!group) notFound() + const expense = await getExpense(groupId, expenseId) + if (!expense) notFound() + + return ( + + + + ) +} diff --git a/src/app/groups/[groupId]/@modal/expenses/create/page.tsx b/src/app/groups/[groupId]/@modal/expenses/create/page.tsx new file mode 100644 index 0000000..93cc413 --- /dev/null +++ b/src/app/groups/[groupId]/@modal/expenses/create/page.tsx @@ -0,0 +1,24 @@ +import { ExpenseModal } from '@/app/groups/[groupId]/@modal/expense-modal' +import { ExpenseForm } from '@/components/expense-form' +import { getGroup } from '@/lib/api' +import { Metadata } from 'next' +import { notFound } from 'next/navigation' + +export const metadata: Metadata = { + title: 'Create expense', +} + +export default async function ExpensePage({ + params: { groupId }, +}: { + params: { groupId: string } +}) { + const group = await getGroup(groupId) + if (!group) notFound() + + return ( + + + + ) +} -- cgit v1.3